在資安事件應變中,日誌分析是最耗時、最關鍵的一步。
傳統 SOC 需要人工過濾大量 log,找出異常登入、惡意請求或 lateral movement。
但 AI Agent 能協助:
這就是 Log Analyzer Agent 的任務:
「讓 AI 幫你把幾萬筆日誌,濃縮成可行的事件摘要。」
1、收集日誌資料
2、AI 分析
3、輸出結果
這個部分建立了一個 Express API,
可以模擬日誌來源、接收請求,並呼叫 LogAnalyzer Agent 進行分析。
express
建立 HTTP 伺服器dotenv
讀取 .env
中的環境變數(API 金鑰)LogAnalyzer
實例,稍後用來呼叫 AI 進行分析import express from "express";
import dotenv from "dotenv";
import { v4 as uuidv4 } from "uuid";
import LogAnalyzer from "./agent.js";
dotenv.config();
const app = express();
app.use(express.json());
const analyzer = new LogAnalyzer();
app.get("/api/logs", (req, res) => {
res.json([
{
id: uuidv4(),
timestamp: "2025-10-04T03:21:12Z",
src_ip: "192.168.10.25",
dst_ip: "10.0.0.8",
method: "POST",
uri: "/login",
status: 401,
message: "Failed login attempt"
},
{
id: uuidv4(),
timestamp: "2025-10-04T03:25:31Z",
src_ip: "192.168.10.25",
dst_ip: "10.0.0.8",
method: "POST",
uri: "/login",
status: 401,
message: "Failed login attempt"
},
{
id: uuidv4(),
timestamp: "2025-10-04T03:26:09Z",
src_ip: "103.22.1.45",
dst_ip: "10.0.0.8",
method: "GET",
uri: "/../../etc/passwd",
status: 403,
message: "Blocked suspicious path traversal"
},
{
id: uuidv4(),
timestamp: "2025-10-04T03:27:45Z",
src_ip: "192.168.10.25",
dst_ip: "10.0.0.8",
method: "POST",
uri: "/login",
status: 200,
message: "Successful login"
}
]);
});
logs
LogAnalyzer
模組進行分析app.post("/api/analyze-logs", async (req, res) => {
const logs = req.body.logs;
if (!logs || !logs.length)
return res.status(400).json({ error: "請提供 logs 陣列" });
const report = await analyzer.generateReport(logs);
res.json(report);
});
http://localhost:3000
運行app.listen(process.env.PORT || 3000, () => {
console.log(`Log Analyzer 啟動中:http://localhost:${process.env.PORT || 3000}`);
});
Agent 模組的主要功能是:
接收日誌 → 呼叫 Gemini 模型 → 生成報告。
.env
中的 Gemini API 金鑰GoogleGenerativeAI
客戶端import dotenv from "dotenv";
import { GoogleGenerativeAI } from "@google/generative-ai";
dotenv.config();
const API_KEY = process.env.GEMINI_API_KEY;
gemini-2.5-flash
replace()
移除 Markdown 符號(避免 JSON.parse 錯誤)export async function LogAnalyzer() {
if (!API_KEY) {
console.error("請在 .env 檔案設定 GEMINI_API_KEY");
return;
}
const genAI = new GoogleGenerativeAI(API_KEY);
const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash" });
const logs = [
{ src_ip: "192.168.10.25", uri: "/login", status: 401, message: "Failed login attempt" },
{ src_ip: "103.22.1.45", uri: "/../../etc/passwd", status: 403, message: "Blocked suspicious path traversal" }
];
const prompt = `
你是一位資安分析師,請根據以下日誌輸出兩份報告:
1. 技術報告:列出各事件詳細資訊(來源 IP、URI、行為類型、嚴重度、建議)。
2. 管理摘要:列出 Top 攻擊來源、受影響系統、改善方向。
日誌資料:
${JSON.stringify(logs, null, 2)}
請輸出 JSON:
{ "technicalReport": [...], "managementSummary": {...} }
`;
console.log("開始分析日誌...\n");
try {
const result = await model.generateContent(prompt);
let text = result.response.text();
// 移除 ```json 和 ```
text = text.replace(/```json\s*|```/g, "").trim();
const report = JSON.parse(text);
console.log("分析結果:");
console.log(JSON.stringify(report, null, 2));
return report;
} catch (err) {
console.error("分析失敗:", err.message);
return { error: err.message };
}
}
LogAnalyzer();